<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 原型：字面意思   原来的模型，原始祖先
        // JS原型：原型就是一个对象，也叫原型对象

        // 1. 所有的函数都有一个prototype属性，属性值也是一个普通的对象
        // 1. 所有的函数都有一个prototype属性（显式原型），这个属性是一个指针，指向原型对象（原型）
        function Person() { }
        console.dir(Person)

        // 2. 原型上默认有一个constructor属性，指向这个构造函数本身
        console.log(Person.prototype.constructor === Person)

        // 3. 可以往这个原型对象中添加属性和方法
        Person.prototype.sing = function () {
            console.log('我是原型上添加的方法')
        }
        Person.prototype.demo = '我是原型上添加的属性'
        console.dir(Person)

        /*==================================    ====================================*/
        function Star(name, age) {
            // 1. 公共的属性写到构造函数里面
            this.name = name
            this.age = age
        }
        // 2. 公共的方法写到原型对象上  节约了内存
        Star.prototype.sing = function () {
            console.log('唱歌')
        }
        Star.prototype.cheer = 'Day Day up'

        // ==> 所有通过构造函数创建的对象，都共享原型上的属性和方法！

        const ldh = new Star('刘德华', 20)
        const zxy = new Star('张学友', 21)

        ldh.sing()
        zxy.sing()
        console.log(ldh.cheer)
        console.log(zxy.cheer)
        console.log(ldh, zxy)

        // ldh.__proto__ ==> Star.prototype
    </script>
</body>

</html>